联合类型
概述
在 TypeScript 中,联合类型(Union Types)是一种允许变量或函数参数具有多种可能类型的机制。通过使用联合类型,我们可以更灵活地定义数据结构,使其能够适应多种数据类型。
理论解释
联合类型通过使用竖线符号 | 来定义,表示一个变量可以是多种类型中的一种。例如,string | number 表示一个变量可以是字符串或数字类型。
语法
let variable: Type1 | Type2 | Type3;
示例
let id: string | number;
id = "12345"; // 有效
id = 12345; // 有效
id = true; // 错误:类型 'boolean' 不能赋值给类型 'string | number'
代码示例
基本联合类型
let value: string | number;
value = "Hello, TypeScript";
console.log(value); // 输出: Hello, TypeScript
value = 42;
console.log(value); // 输出: 42
函数参数的联合类型
function printId(id: string | number) {
console.log(`ID: ${id}`);
}
printId("12345"); // 输出: ID: 12345
printId(12345); // 输出: ID: 12345
类型保护
在使用联合类型时,有时需要根据变量的实际类型执行不同的操作。这时可以使用类型保护(Type Guards)来区分类型。
function printId(id: string | number) {
if (typeof id === "string") {
console.log(`String ID: ${id.toUpperCase()}`);
} else {
console.log(`Number ID: ${id}`);
}
}
printId("12345"); // 输出: String ID: 12345
printId(12345); // 输出: Number ID: 12345
实践练习
练习 1:联合类型与函数
编写一个函数 formatValue,该函数接受一个参数 value,可以是 string 或 number。如果 value 是字符串,则返回其大写形式;如果是数字,则返回其字符串表示。
function formatValue(value: string | number): string {
if (typeof value === "string") {
return value.toUpperCase();
} else {
return value.toString();
}
}
console.log(formatValue("hello")); // 输出: HELLO
console.log(formatValue(42)); // 输出: 42
练习 2:联合类型与数组
定义一个数组 values,其中每个元素可以是 string 或 number。编写一个函数 sumOrConcat,该函数接受这个数组并返回结果。如果数组中所有元素都是数字,则返回它们的和;否则,返回所有字符串的连接结果。
function sumOrConcat(values: (string | number)[]): string | number {
let isAllNumbers = values.every(value => typeof value === "number");
if (isAllNumbers) {
return values.reduce((sum, value) => sum + value, 0);
} else {
return values.filter(value => typeof value === "string").join("");
}
}
console.log(sumOrConcat([1, 2, 3])); // 输出: 6
console.log(sumOrConcat(["a", "b", "c"])); // 输出: abc
console.log(sumOrConcat([1, "a", 2, "b"])); // 输出: ab
总结
联合类型是 TypeScript 中一个非常强大的特性,它允许我们定义更加灵活的数据结构。通过结合类型保护,我们可以在运行时根据变量的实际类型执行不同的操作。掌握联合类型将使你在编写 TypeScript 代码时更加得心应手。
下一步
接下来,我们将探讨 TypeScript 中的交叉类型(Intersection Types),它允许我们将多个类型组合成一个新类型。